package org.dromara.common.mybatis.v1;


import cn.hutool.core.util.ReflectUtil;

import java.lang.reflect.Field;
import java.util.Date;


/**
 * 实体类相关工具类
 * 解决问题： 1、快速对实体的常驻字段，如：crtUser、crtHost、updUser等值快速注入
 *
 * @author Ace
 * @version 1.0
 * @date 2016年4月18日
 * @since 1.7
 */
public class EntityUtils {
    /**
     * 快速将bean的crtUser、crtHost、crtTime、updUser、updHost、updTime附上相关值
     *
     * @param entity 实体bean
     * @author 王浩彬
     */
    public static <T> void setCreatAndUpdatInfo(T entity) {
        setCreateInfo(entity);
        setUpdatedInfo(entity);
    }

    /**
     * 快速将bean的crtUser、crtHost、crtTime附上相关值
     *
     * @param entity 实体bean
     * @author 王浩彬
     */
    public static <T> void setCreateInfo(T entity) {


        // 默认属性
        String[] dateFields = {"createTime", "createDate"};

        for (String fieldStr : dateFields) {
            Field field = ReflectUtil.getField(entity.getClass(), fieldStr);

            // 默认值
            Object value = null;
            if (field != null) {
                value = new Date();
            }
            // 填充默认属性值
            if (value != null) {
                setDefaultValues(entity, fieldStr, value);
            }
        }
    }

    /**
     * 快速将bean的updUser、updHost、updTime附上相关值
     *
     * @param entity 实体bean
     * @author 王浩彬
     */
    public static <T> void setUpdatedInfo(T entity) {

        // 默认属性
        String[] dateFields = {"updateTime", "updateDate", "modifyTime", "modifyDate"};

        for (String fieldStr : dateFields) {
            Field field = ReflectUtil.getField(entity.getClass(), fieldStr);

            // 默认值
            Object value = null;
            if (field != null) {
                value = new Date();
            }
            // 填充默认属性值
            if (value != null)
                setDefaultValues(entity, fieldStr, value);
        }
    }

    private static <T> void setDefaultValues(T entity, String field, Object value) {

        if (value != null) {
            if (ReflectUtil.hasField(entity.getClass(), field)) {
                Object o = ReflectUtil.getFieldValue(entity, field);
                if (o == null) {
                    ReflectUtil.setFieldValue(entity, field, value);
                }
            }
        }
    }

    /**
     * 依据对象的属性数组和值数组对对象的属性进行赋值
     *
     * @param entity 对象
     * @param fields 属性数组
     * @param value  值数组
     * @author 王浩彬
     */
    private static <T> void setDefaultValues(T entity, String[] fields, Object[] value) {
        for (int i = 0; i < fields.length; i++) {
            String field = fields[i];
            if (value[i] != null) {
                if (ReflectUtil.hasField(entity.getClass(), field)) {
                    ReflectUtil.setFieldValue(entity, field, value[i]);
                }
            }
        }
    }

    /**
     * 根据主键属性，判断主键是否值为空
     *
     * @param entity
     * @param field
     * @return 主键为空，则返回false；主键有值，返回true
     * @author 王浩彬
     * @date 2016年4月28日
     */
    public static <T> boolean isPKNotNull(T entity, String field) {
        if (!ReflectUtil.hasField(entity.getClass(), field)) {
            return false;
        }
        Object value = ReflectUtil.getFieldValue(entity, field);
        return value != null && !"".equals(value);
    }
}
